package util.estatisticas.metricas;

import java.util.ArrayList;

import util.Util;
import util.graficos.GraficoCDF;
import util.graficos.GraficoMedianaTempoDownload;
import util.graficos.GraficoTempoDownloadIC;
import util.output.Saida;
import entidades.Peer;

public class TempoMedioDownload {
	
	private EstimadorMedia estimadorMedia;
	
	private EstimadorVariancia estimadorVariancia;
	
	private Mediana mediana;
	
	private GraficoTempoDownloadIC graficoTempoDownloadIC;
	
	private GraficoCDF graficoCDF;
	
	private GraficoMedianaTempoDownload graficoMedianaTempoDownload;

	public TempoMedioDownload() {
		this.estimadorMedia = new EstimadorMedia();
		this.estimadorVariancia = new EstimadorVariancia();
		this.mediana = new Mediana();
		
		if (Util.PLOTAR_GRAFICOS) {
			this.graficoCDF = new GraficoCDF();
			this.graficoTempoDownloadIC = new GraficoTempoDownloadIC();
			this.graficoMedianaTempoDownload = new GraficoMedianaTempoDownload();
		}
	}
	
	public void calculaXi(final int rodada, final ArrayList<Peer> peers) {
		ArrayList<Double> temposDownload = new ArrayList<Double>();
		double tempoMedio = 0;
		int totalPeers = 0;
		
		for (Peer p : peers) {
			double tempoDownload = p.getInstanteSaida() - p.getInstanteChegada();
			
			if (tempoDownload > 0) {
				temposDownload.add(tempoDownload);
				tempoMedio += tempoDownload;
				totalPeers++;
			}
		}
		
		tempoMedio /= totalPeers;
		
		this.estimadorMedia.atualiza(tempoMedio);
		this.estimadorVariancia.atualiza(tempoMedio);
		this.mediana.atualiza(temposDownload);
		
		if (Util.PLOTAR_GRAFICOS) {
			this.graficoCDF.adicionaPontos(temposDownload, rodada);
			this.graficoTempoDownloadIC.adicionaRodada(this.getEstimadorMedia(), this.getEstimadorVariancia(), rodada);
			this.graficoMedianaTempoDownload.adicionaRodada(this.mediana.getEstimadorMedia(), this.mediana.getEstimadorVariancia(), rodada);
		}
		
	}

	public double getEstimadorMedia() {
		return estimadorMedia.getEstimador();
	}

	public double getEstimadorVariancia() {
		return estimadorVariancia.getEstimador();
	}
	
	public void plot() {
		if (Util.PLOTAR_GRAFICOS) {
			this.graficoCDF.plot();
			this.graficoTempoDownloadIC.plot();
			this.graficoMedianaTempoDownload.plot();
		}
	}
	
	public void imprimeIC() {
		Saida.imprime("=*= Tempo de Download =*=");
		Saida.imprime("\tIntervalo de Confiança");
		Saida.imprime("\t\tEstimador da Média: " + this.estimadorMedia.getEstimador());
		Saida.imprime("\t\tEstimador da Variância: " + this.estimadorVariancia.getEstimador());
	}
	
	public void imprimeMediana() {
		Saida.imprime("=*= Tempo de Download =*=");
		Saida.imprime("\tMediana");
		Saida.imprime("\t\tEstimador da Média: " + this.mediana.getEstimadorMedia());
		Saida.imprime("\t\tEstimador da Variância: " + this.mediana.getEstimadorVariancia());
	}
}